package com.small.sentinel.slots.block.degrade.circuitbreaker;

import com.small.sentinel.Context;
import com.small.sentinel.slots.block.degrade.DegradeRule;

/**
 * 断路器
 */
public interface CircuitBreaker {

    /**
     * 获取相关的断路规则
     */
    DegradeRule getRule();

    /**
     * 仅在调用时可用时获取调用权限
     */
    boolean tryPass(Context context);

    /**
     * 获取断路器的当前状态
     */
    State currentState();

    /**
     *用上下文记录一个完整的请求，
     */
    void onRequestComplete(Context context);

    enum State {
        /**
         * 在OPEN状态下，所有请求都将被拒绝，直到下一个恢复时间点。
         */
        OPEN,
        /**
         *在HALF_OPEN状态下，断路器将允许“探测”调用。如果根据策略调用异常（例如，它很慢），
         * 断路器将重新转换为OPEN状态并等待下一个恢复时间点；
         * 否则资源将被视为“已恢复”，断路器将停止切断请求并转换为CLOSED状态
         */
        HALF_OPEN,
        /**
         * 在CLOSED状态下，允许所有请求。当电流度量值超过阈值时，断路器将转换为OPEN状态。
         */
        CLOSED
    }
}
